/**
 * 
 */
package btc.backend.clasificador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import btc.backend.process.ConnectionFactory;
import btc.backend.servicios.BloqueAppl;
import btc.backend.servicios.PalletAppl;
import btc.model.Bloque;
import btc.model.ClasificacionPallet;
import btc.model.Pallet;

/**
 * @author Dario
 *
 */
public class ClasificadorPalletPorExtension implements ClasificadorDePallet{

	public void clasificar(Pallet pallet) {
		
		List<Bloque> bloques = new BloqueAppl().obtenerBloquesPorPallet(pallet);
		
		Connection conexion = ConnectionFactory.getConnection();
		
		int cantidadBloquesPrimera = 0;
		int cantidadBloquesSegunda = 0;
		int cantidadBloquesParaDesechar = 0;
		
		try {
			PreparedStatement updateBloqueSt = conexion.prepareStatement("update bloque set clasificacion = ? where id = ?");
			
			for (Bloque bloqueActual : bloques) {
				int ancho = bloqueActual.getAncho();
				int alto = bloqueActual.getAlto();
				int largo = bloqueActual.getLargo();
				
				if((ancho>= ClasificadorDePallet.BLOQUE_ANCHO_ESTANDAR - ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
						(ancho<= ClasificadorDePallet.BLOQUE_ANCHO_ESTANDAR + ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
						(alto>= ClasificadorDePallet.BLOQUE_ALTO_ESTANDAR - ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
						(alto<= ClasificadorDePallet.BLOQUE_ALTO_ESTANDAR + ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
						(largo>= ClasificadorDePallet.BLOQUE_LARGO_ESTANDAR - ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD) &&
						(largo<= ClasificadorDePallet.BLOQUE_LARGO_ESTANDAR + ClasificadorDePallet.VARIACION_PRIMERA_CALIDAD))
				{
					bloqueActual.setClasificacion(ClasificadorDePallet.BLOQUE_PRIMERA_CALIDAD);
					cantidadBloquesPrimera++;
				}
				else if((ancho>= ClasificadorDePallet.BLOQUE_ANCHO_ESTANDAR - ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
						(ancho<= ClasificadorDePallet.BLOQUE_ANCHO_ESTANDAR + ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
						(alto>= ClasificadorDePallet.BLOQUE_ALTO_ESTANDAR - ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
						(alto<= ClasificadorDePallet.BLOQUE_ALTO_ESTANDAR + ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
						(largo>= ClasificadorDePallet.BLOQUE_LARGO_ESTANDAR - ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD) &&
						(largo<= ClasificadorDePallet.BLOQUE_LARGO_ESTANDAR + ClasificadorDePallet.VARIACION_SEGUNDA_CALIDAD))
				{
					bloqueActual.setClasificacion(ClasificadorDePallet.BLOQUE_SEGUNDA_CALIDAD);
					cantidadBloquesSegunda++;
				}
				else
				{
					bloqueActual.setClasificacion(ClasificadorDePallet.BLOQUE_PARA_DESECHO);
					cantidadBloquesParaDesechar++;						
				}
				
				updateBloqueSt.setString(1, bloqueActual.getClasificacion());
				updateBloqueSt.setLong(2, bloqueActual.getId());
				updateBloqueSt.addBatch();
			}
			
			updateBloqueSt.executeBatch();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		String clasificacionPallet = ClasificacionPallet.INSERVIBLE;
		
		if(cantidadBloquesPrimera>cantidadBloquesSegunda && cantidadBloquesPrimera > cantidadBloquesParaDesechar)
			clasificacionPallet = ClasificacionPallet.PRIMERA;
		else if (cantidadBloquesSegunda>=cantidadBloquesPrimera && cantidadBloquesSegunda > cantidadBloquesParaDesechar)
			clasificacionPallet = ClasificacionPallet.SEGUNDA;
		
		new PalletAppl().actualizarClasificacionDePallet(pallet.getId(), clasificacionPallet);

	}


    @Override
    public void clasificar(Pallet pallet, int cantidadDeMuestras, float umbralPrimera, float umbralSegunda) {
        clasificar(pallet);
    }
}
